# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# NOTE: This file is auto generated by the elixir code generator program.
# Do not edit this file manually.

defmodule GoogleApi.CloudAsset.V1.Model.ResourceSearchResult do
  @moduledoc """
  A result of Resource Search, containing information of a cloud resource.

  ## Attributes

  *   `additionalAttributes` (*type:* `map()`, *default:* `nil`) - The additional searchable attributes of this resource. The attributes may vary from one resource type to another. Examples: `projectId` for Project, `dnsName` for DNS ManagedZone. This field contains a subset of the resource metadata fields that are returned by the List or Get APIs provided by the corresponding Google Cloud service (e.g., Compute Engine). see [API references and supported searchable attributes](https://cloud.google.com/asset-inventory/docs/supported-asset-types) to see which fields are included. You can search values of these fields through free text search. However, you should not consume the field programically as the field names and values may change as the Google Cloud service updates to a new incompatible API version. To search against the `additional_attributes`: * Use a free text query to match the attributes values. Example: to search `additional_attributes = { dnsName: "foobar" }`, you can issue a query `foobar`.
  *   `assetType` (*type:* `String.t`, *default:* `nil`) - The type of this resource. Example: `compute.googleapis.com/Disk`. To search against the `asset_type`: * Specify the `asset_type` field in your search request.
  *   `attachedResources` (*type:* `list(GoogleApi.CloudAsset.V1.Model.AttachedResource.t)`, *default:* `nil`) - Attached resources of this resource. For example, an OSConfig Inventory is an attached resource of a Compute Instance. This field is repeated because a resource could have multiple attached resources. This `attached_resources` field is not searchable. Some attributes of the attached resources are exposed in `additional_attributes` field, so as to allow users to search on them.
  *   `createTime` (*type:* `DateTime.t`, *default:* `nil`) - The create timestamp of this resource, at which the resource was created. The granularity is in seconds. Timestamp.nanos will always be 0. This field is available only when the resource's Protobuf contains it. To search against `create_time`: * Use a field query. - value in seconds since unix epoch. Example: `createTime > 1609459200` - value in date string. Example: `createTime > 2021-01-01` - value in date-time string (must be quoted). Example: `createTime > "2021-01-01T00:00:00"`
  *   `description` (*type:* `String.t`, *default:* `nil`) - One or more paragraphs of text description of this resource. Maximum length could be up to 1M bytes. This field is available only when the resource's Protobuf contains it. To search against the `description`: * Use a field query. Example: `description:"important instance"` * Use a free text query. Example: `"important instance"`
  *   `displayName` (*type:* `String.t`, *default:* `nil`) - The display name of this resource. This field is available only when the resource's Protobuf contains it. To search against the `display_name`: * Use a field query. Example: `displayName:"My Instance"` * Use a free text query. Example: `"My Instance"`
  *   `effectiveTags` (*type:* `list(GoogleApi.CloudAsset.V1.Model.EffectiveTagDetails.t)`, *default:* `nil`) - The effective tags on this resource. All of the tags that are both attached to and inherited by a resource are collectively called the effective tags. For more information, see [tag inheritance](https://cloud.google.com/resource-manager/docs/tags/tags-overview#inheritance). To search against the `effective_tags`: * Use a field query. Example: - `effectiveTagKeys:"123456789/env*"` - `effectiveTagKeys="123456789/env"` - `effectiveTagKeys:"env"` - `effectiveTagKeyIds="tagKeys/123"` - `effectiveTagValues:"env"` - `effectiveTagValues:"env/prod"` - `effectiveTagValues:"123456789/env/prod*"` - `effectiveTagValues="123456789/env/prod"` - `effectiveTagValueIds="tagValues/456"`
  *   `enrichments` (*type:* `list(GoogleApi.CloudAsset.V1.Model.AssetEnrichment.t)`, *default:* `nil`) - Enrichments of the asset. Currently supported enrichment types with SearchAllResources API: * RESOURCE_OWNERS The corresponding read masks in order to get the enrichment: * enrichments.resource_owners The corresponding required permissions: * cloudasset.assets.searchEnrichmentResourceOwners Example query to get resource owner enrichment: ``` scope: "projects/my-project" query: "name: my-project" assetTypes: "cloudresourcemanager.googleapis.com/Project" readMask: { paths: "asset_type" paths: "name" paths: "enrichments.resource_owners" } ```
  *   `folders` (*type:* `list(String.t)`, *default:* `nil`) - The folder(s) that this resource belongs to, in the form of folders/{FOLDER_NUMBER}. This field is available when the resource belongs to one or more folders. To search against `folders`: * Use a field query. Example: `folders:(123 OR 456)` * Use a free text query. Example: `123` * Specify the `scope` field as this folder in your search request.
  *   `kmsKey` (*type:* `String.t`, *default:* `nil`) - The Cloud KMS [CryptoKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys) name or [CryptoKeyVersion](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions) name. This field only presents for the purpose of backward compatibility. Use the `kms_keys` field to retrieve Cloud KMS key information. This field is available only when the resource's Protobuf contains it and will only be populated for [these resource types](https://cloud.google.com/asset-inventory/docs/legacy-field-names#resource_types_with_the_to_be_deprecated_kmskey_field) for backward compatible purposes. To search against the `kms_key`: * Use a field query. Example: `kmsKey:key` * Use a free text query. Example: `key`
  *   `kmsKeys` (*type:* `list(String.t)`, *default:* `nil`) - The Cloud KMS [CryptoKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys) names or [CryptoKeyVersion](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions) names. This field is available only when the resource's Protobuf contains it. To search against the `kms_keys`: * Use a field query. Example: `kmsKeys:key` * Use a free text query. Example: `key`
  *   `labels` (*type:* `map()`, *default:* `nil`) - User labels associated with this resource. See [Labelling and grouping Google Cloud resources](https://cloud.google.com/blog/products/gcp/labelling-and-grouping-your-google-cloud-platform-resources) for more information. This field is available only when the resource's Protobuf contains it. To search against the `labels`: * Use a field query: - query on any label's key or value. Example: `labels:prod` - query by a given label. Example: `labels.env:prod` - query by a given label's existence. Example: `labels.env:*` * Use a free text query. Example: `prod`
  *   `location` (*type:* `String.t`, *default:* `nil`) - Location can be `global`, regional like `us-east1`, or zonal like `us-west1-b`. This field is available only when the resource's Protobuf contains it. To search against the `location`: * Use a field query. Example: `location:us-west*` * Use a free text query. Example: `us-west*`
  *   `name` (*type:* `String.t`, *default:* `nil`) - The full resource name of this resource. Example: `//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1`. See [Cloud Asset Inventory Resource Name Format](https://cloud.google.com/asset-inventory/docs/resource-name-format) for more information. To search against the `name`: * Use a field query. Example: `name:instance1` * Use a free text query. Example: `instance1`
  *   `networkTags` (*type:* `list(String.t)`, *default:* `nil`) - Network tags associated with this resource. Like labels, network tags are a type of annotations used to group Google Cloud resources. See [Labelling Google Cloud resources](https://cloud.google.com/blog/products/gcp/labelling-and-grouping-your-google-cloud-platform-resources) for more information. This field is available only when the resource's Protobuf contains it. To search against the `network_tags`: * Use a field query. Example: `networkTags:internal` * Use a free text query. Example: `internal`
  *   `organization` (*type:* `String.t`, *default:* `nil`) - The organization that this resource belongs to, in the form of organizations/{ORGANIZATION_NUMBER}. This field is available when the resource belongs to an organization. To search against `organization`: * Use a field query. Example: `organization:123` * Use a free text query. Example: `123` * Specify the `scope` field as this organization in your search request.
  *   `parentAssetType` (*type:* `String.t`, *default:* `nil`) - The type of this resource's immediate parent, if there is one. To search against the `parent_asset_type`: * Use a field query. Example: `parentAssetType:"cloudresourcemanager.googleapis.com/Project"` * Use a free text query. Example: `cloudresourcemanager.googleapis.com/Project`
  *   `parentFullResourceName` (*type:* `String.t`, *default:* `nil`) - The full resource name of this resource's parent, if it has one. To search against the `parent_full_resource_name`: * Use a field query. Example: `parentFullResourceName:"project-name"` * Use a free text query. Example: `project-name`
  *   `project` (*type:* `String.t`, *default:* `nil`) - The project that this resource belongs to, in the form of projects/{PROJECT_NUMBER}. This field is available when the resource belongs to a project. To search against `project`: * Use a field query. Example: `project:12345` * Use a free text query. Example: `12345` * Specify the `scope` field as this project in your search request.
  *   `relationships` (*type:* `%{optional(String.t) => GoogleApi.CloudAsset.V1.Model.RelatedResources.t}`, *default:* `nil`) - A map of related resources of this resource, keyed by the relationship type. A relationship type is in the format of {SourceType}_{ACTION}_{DestType}. Example: `DISK_TO_INSTANCE`, `DISK_TO_NETWORK`, `INSTANCE_TO_INSTANCEGROUP`. See [supported relationship types](https://cloud.google.com/asset-inventory/docs/supported-asset-types#supported_relationship_types).
  *   `sccSecurityMarks` (*type:* `map()`, *default:* `nil`) - The actual content of Security Command Center security marks associated with the asset. To search against SCC SecurityMarks field: * Use a field query: - query by a given key value pair. Example: `sccSecurityMarks.foo=bar` - query by a given key's existence. Example: `sccSecurityMarks.foo:*`
  *   `state` (*type:* `String.t`, *default:* `nil`) - The state of this resource. Different resources types have different state definitions that are mapped from various fields of different resource types. This field is available only when the resource's Protobuf contains it. Example: If the resource is an instance provided by Compute Engine, its state will include PROVISIONING, STAGING, RUNNING, STOPPING, SUSPENDING, SUSPENDED, REPAIRING, and TERMINATED. See `status` definition in [API Reference](https://cloud.google.com/compute/docs/reference/rest/v1/instances). If the resource is a project provided by Resource Manager, its state will include LIFECYCLE_STATE_UNSPECIFIED, ACTIVE, DELETE_REQUESTED and DELETE_IN_PROGRESS. See `lifecycleState` definition in [API Reference](https://cloud.google.com/resource-manager/reference/rest/v1/projects). To search against the `state`: * Use a field query. Example: `state:RUNNING` * Use a free text query. Example: `RUNNING`
  *   `tagKeys` (*type:* `list(String.t)`, *default:* `nil`) - This field is only present for the purpose of backward compatibility. Use the `tags` field instead. TagKey namespaced names, in the format of {ORG_ID}/{TAG_KEY_SHORT_NAME}. To search against the `tagKeys`: * Use a field query. Example: - `tagKeys:"123456789/env*"` - `tagKeys="123456789/env"` - `tagKeys:"env"` * Use a free text query. Example: - `env`
  *   `tagValueIds` (*type:* `list(String.t)`, *default:* `nil`) - This field is only present for the purpose of backward compatibility. Use the `tags` field instead. TagValue IDs, in the format of tagValues/{TAG_VALUE_ID}. To search against the `tagValueIds`: * Use a field query. Example: - `tagValueIds="tagValues/456"` * Use a free text query. Example: - `456`
  *   `tagValues` (*type:* `list(String.t)`, *default:* `nil`) - This field is only present for the purpose of backward compatibility. Use the `tags` field instead. TagValue namespaced names, in the format of {ORG_ID}/{TAG_KEY_SHORT_NAME}/{TAG_VALUE_SHORT_NAME}. To search against the `tagValues`: * Use a field query. Example: - `tagValues:"env"` - `tagValues:"env/prod"` - `tagValues:"123456789/env/prod*"` - `tagValues="123456789/env/prod"` * Use a free text query. Example: - `prod`
  *   `tags` (*type:* `list(GoogleApi.CloudAsset.V1.Model.Tag.t)`, *default:* `nil`) - The tags directly attached to this resource. To search against the `tags`: * Use a field query. Example: - `tagKeys:"123456789/env*"` - `tagKeys="123456789/env"` - `tagKeys:"env"` - `tagKeyIds="tagKeys/123"` - `tagValues:"env"` - `tagValues:"env/prod"` - `tagValues:"123456789/env/prod*"` - `tagValues="123456789/env/prod"` - `tagValueIds="tagValues/456"` * Use a free text query. Example: - `env/prod`
  *   `updateTime` (*type:* `DateTime.t`, *default:* `nil`) - The last update timestamp of this resource, at which the resource was last modified or deleted. The granularity is in seconds. Timestamp.nanos will always be 0. This field is available only when the resource's Protobuf contains it. To search against `update_time`: * Use a field query. - value in seconds since unix epoch. Example: `updateTime < 1609459200` - value in date string. Example: `updateTime < 2021-01-01` - value in date-time string (must be quoted). Example: `updateTime < "2021-01-01T00:00:00"`
  *   `versionedResources` (*type:* `list(GoogleApi.CloudAsset.V1.Model.VersionedResource.t)`, *default:* `nil`) - Versioned resource representations of this resource. This is repeated because there could be multiple versions of resource representations during version migration. This `versioned_resources` field is not searchable. Some attributes of the resource representations are exposed in `additional_attributes` field, so as to allow users to search on them.
  """

  use GoogleApi.Gax.ModelBase

  @type t :: %__MODULE__{
          :additionalAttributes => map() | nil,
          :assetType => String.t() | nil,
          :attachedResources => list(GoogleApi.CloudAsset.V1.Model.AttachedResource.t()) | nil,
          :createTime => DateTime.t() | nil,
          :description => String.t() | nil,
          :displayName => String.t() | nil,
          :effectiveTags => list(GoogleApi.CloudAsset.V1.Model.EffectiveTagDetails.t()) | nil,
          :enrichments => list(GoogleApi.CloudAsset.V1.Model.AssetEnrichment.t()) | nil,
          :folders => list(String.t()) | nil,
          :kmsKey => String.t() | nil,
          :kmsKeys => list(String.t()) | nil,
          :labels => map() | nil,
          :location => String.t() | nil,
          :name => String.t() | nil,
          :networkTags => list(String.t()) | nil,
          :organization => String.t() | nil,
          :parentAssetType => String.t() | nil,
          :parentFullResourceName => String.t() | nil,
          :project => String.t() | nil,
          :relationships =>
            %{optional(String.t()) => GoogleApi.CloudAsset.V1.Model.RelatedResources.t()} | nil,
          :sccSecurityMarks => map() | nil,
          :state => String.t() | nil,
          :tagKeys => list(String.t()) | nil,
          :tagValueIds => list(String.t()) | nil,
          :tagValues => list(String.t()) | nil,
          :tags => list(GoogleApi.CloudAsset.V1.Model.Tag.t()) | nil,
          :updateTime => DateTime.t() | nil,
          :versionedResources => list(GoogleApi.CloudAsset.V1.Model.VersionedResource.t()) | nil
        }

  field(:additionalAttributes, type: :map)
  field(:assetType)
  field(:attachedResources, as: GoogleApi.CloudAsset.V1.Model.AttachedResource, type: :list)
  field(:createTime, as: DateTime)
  field(:description)
  field(:displayName)
  field(:effectiveTags, as: GoogleApi.CloudAsset.V1.Model.EffectiveTagDetails, type: :list)
  field(:enrichments, as: GoogleApi.CloudAsset.V1.Model.AssetEnrichment, type: :list)
  field(:folders, type: :list)
  field(:kmsKey)
  field(:kmsKeys, type: :list)
  field(:labels, type: :map)
  field(:location)
  field(:name)
  field(:networkTags, type: :list)
  field(:organization)
  field(:parentAssetType)
  field(:parentFullResourceName)
  field(:project)
  field(:relationships, as: GoogleApi.CloudAsset.V1.Model.RelatedResources, type: :map)
  field(:sccSecurityMarks, type: :map)
  field(:state)
  field(:tagKeys, type: :list)
  field(:tagValueIds, type: :list)
  field(:tagValues, type: :list)
  field(:tags, as: GoogleApi.CloudAsset.V1.Model.Tag, type: :list)
  field(:updateTime, as: DateTime)
  field(:versionedResources, as: GoogleApi.CloudAsset.V1.Model.VersionedResource, type: :list)
end

defimpl Poison.Decoder, for: GoogleApi.CloudAsset.V1.Model.ResourceSearchResult do
  def decode(value, options) do
    GoogleApi.CloudAsset.V1.Model.ResourceSearchResult.decode(value, options)
  end
end

defimpl Poison.Encoder, for: GoogleApi.CloudAsset.V1.Model.ResourceSearchResult do
  def encode(value, options) do
    GoogleApi.Gax.ModelBase.encode(value, options)
  end
end
